<?php
use \Firebase\JWT\JWT;
// 应用公共文件

/**
 * 对字符进行强加密
 * @param string $str 待加密字符串
 */
function strongmd5($str) {
    return sha1(md5($str).'creative');
}

/**
 * 随机生成字符
 * @param int $length 字符长度
 * @return string
 */
function generate_password($length = 4)
{
    // 密码字符集，可任意添加你需要的字符
    $chars = 'abcdefghjkmnopqrstuvwxyz023456789';
    $password = '';
    for ($i = 0; $i < $length; $i++) {
        // 这里提供两种字符获取方式
        // 第一种是使用 substr 截取$chars中的任意一位字符；
        // 第二种是取字符数组 $chars 的任意元素
        // $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
        $password .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $password;
}

/**
 * token
 * @return array|string|string[]
 */
function token()
{
    $v = 1;
    $key = mt_rand();
    $hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true);
    $token = str_replace('=', '', strtr(base64_encode($hash), '+/', '-_'));
    return $token;
}


/**
 * 生成验签
 * @param $uid 用户id
 * @return mixed
 */
function signToken($uid){
    $key='abcdefg';         //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt
    $token=array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户，可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time()+3,    //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
        "exp"=> time()+7200, //token 过期时间
        "data"=>[           //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
            'uid'=>$uid,
        ]
    );
    //  print_r($token);
    $jwt = JWT::encode($token, $key, "HS256");  //根据参数生成了 token
    return $jwt;
}

/**
 * 验证token
 * @param $token
 * @return array|int[]
 */
function checkToken($token){
    $key='abcdefg';
    $res['status'] = false;
    try {
        JWT::$leeway    = 60;//当前时间减去60，把时间留点余地
        $decoded        = JWT::decode($token, $key, array('HS256')); //HS256方式，这里要和签发的时候对应
        $arr            = (array)$decoded;
        $res['status']  = 200;
        $res['data']    =(array)$arr['data'];
        return $res;

    } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
        $res['info']    = "签名不正确";
        return $res;
    }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
        $res['info']    = "token失效";
        return $res;
    }catch(\Firebase\JWT\ExpiredException $e) { // token过期
        $res['info']    = "token失效";
        return $res;
    }catch(Exception $e) { //其他错误
        $res['info']    = "未知错误";
        return $res;
    }
}

